package com.sojson.constant;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;

import org.springframework.core.env.ConfigurableEnvironment;

import com.sojson.enums.EUserType;
import com.sojson.util.SystemParamBaseUtil;
import com.sojson.util.file.enums.EFileType;
import com.sojson.util.pwd.PwdUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 静态属性类
 *
 * @author liu
 * @date 2020-11-02
 */
@Slf4j
public class Constant {

    /** ----------------------------以下是静态属性---------------------------- */
    /** ----------------------------以下是静态属性---------------------------- */
    /** ----------------------------以下是静态属性---------------------------- */

    /** 全局随机类 */
    public static final Random RANDOM = new Random();

    /** 超级管理员的ID */
    public static final String ADMIN_ID = "1";
    /** UTF-8 字符集 */
    public static final String UTF8 = "UTF-8";
    /** GBK 字符集 */
    public static final String GBK = "GBK";
    /** 统一的编码格式 */
    public static final String DEFAULT_ENCODING = UTF8;
    /** * */
    public static final String X = "*";
    /** . */
    public static final String JH = ".";
    /** ' */
    public static final String DYH = "'";
    /** 菜单父级ID */
    public static final String MENU_PARENT_ID = "0";
    /** 数据为空的时候的默认值 */
    public static final String DEFAULT_EMPTY = "null";
    /** 1秒(单位:毫秒) */
    public static final long MILLIS_SECOND = 1000;
    /** 1分钟(单位:毫秒) */
    public static final long MILLIS_MINUTE = MILLIS_SECOND * 60;
    /** 30分钟(单位:毫秒) */
    public static final long MILLIS_MINUTE_THIRTY = MILLIS_MINUTE * 30;
    /** 1小时(单位:毫秒) */
    public static final long MILLIS_HOURS = MILLIS_MINUTE * 60;
    /** 12小时(单位:毫秒) */
    public static final long MILLIS_HOURS_TWELVE = MILLIS_HOURS * 12;
    /** 1天(单位:毫秒) */
    public static final long MILLIS_DAY = MILLIS_HOURS_TWELVE * 2;
    /** 30天(单位:毫秒) */
    public static final long MILLIS_DAY_THIRTY = MILLIS_DAY * 30;
    /** 防止重复提交的默认等待时间(单位: 毫秒) */
    public static final int RE_COMMIT_EXPIRE_TIME_DEFAULT = (int)(MILLIS_SECOND * 2);
    /** 100(用于计算) */
    public static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
    /** 生成的图片的统一格式 */
    public static final EFileType GENERATE_IMG = EFileType.PNG;
    /** 生成的图片的统一格式 */
    public static final String GENERATE_IMG_SUFFIX = EFileType.PNG.getName();
    /** Layout组件标识 */
    public static final String LAYOUT = "Layout";
    /** 用户的默认密码在缓存中的KEY */
    public static final String USER_PASSWORD_KEY = "sys_user_init_pwd";
    /** 查询优惠券的截止多久时间(单位:天) */
    public static final long COUPON_SELECT_ABORT_TIME_DAY = 30;
    /** 查询优惠券的截止多久时间(单位:毫秒) */
    public static final long COUPON_SELECT_ABORT_TIME_MILLIS = MILLIS_DAY * COUPON_SELECT_ABORT_TIME_DAY;
    /** 用户表集合 */
    public static final List<String> USET_TABLE_NAMES = getUserTableNames();

    /** ---------------------------订单时间--------------------------- */
    /** 订单支付超时时间 */
    public static final long ORDER_PAY_TIME = MILLIS_DAY * 1;
    /** 酒店订单支付超时时间 */
    public static final long ORDER_PAY_TIME_HOTEL = MILLIS_MINUTE * 30;
    /** 订单签收超时时间 */
    public static final long ORDER_SIGN_FOR_TIME = MILLIS_DAY * 10;
    /** 酒店订单确认超时时间 */
    public static final long ORDER_HOTEL_SIGN_FOR_TIME = MILLIS_DAY / 2;
    /** 诚意金订单支付超时时间 */
    public static final long ORDER_DEPOSIT_PAY_TIME = MILLIS_DAY * 30;

    /** ---------------------------系统属性KEY--------------------------- */
    public static final String INVITE_BALANCE = "invite_balance";

    /** ---------------------------这是邮箱帐号的唯一标识--------------------------- */
    /** 邮箱帐号的唯一标识 */
    public static final String MAIL_FROM_USER_ID = "MAIL_FROM_USER_CODE";

    /** ---------------------------这是短信帐号的唯一标识--------------------------- */
    /** 短信帐号的唯一标识 */
    public static final String SMS_AK_ACCESS_ID = "SMS_AK_ACCESS_KEY_CODE";
    /** ----------------------------以下是短信模板的唯一标识---------------------------- */
    /** 短信验证码模板的唯一标识 */
    public static final String MESSAGE_AUTHENTICATION_CODE = "MESSAGE_AUTHENTICATION_CODE";
    /** 第三方登录的类型 */
    public static final String THIRD_USER_TYPE = "QQ,WXPC,WX,WB";

    /** -----------------------------以下是集合---------------------------- */
    /** -----------------------------以下是集合---------------------------- */
    /** -----------------------------以下是集合---------------------------- */
    /** 要创建的目录路径集合 */
    public static final Properties LOG_PATH = new Properties();
    // /** 短信模板集合,通过短信模板code获取模板 */
    // Map<String, SoSmsTemplate> SMS_TEMPLATE = new HashMap<>();

    // =======================================================================================================
    // =======================================================================================================
    // =======================================================================================================
    /** properties文件属性以及从数据库中读取的可变的proeprties属性以及其他字符属性 */
    public static ConfigurableEnvironment PROPERTIES;

    // =======================================================================================================
    // =======================================================================================================
    // =======================================================================================================

    public static String getUserPassword() throws IOException {
        return getUserPassword(SystemParamBaseUtil.getStr(Constant.USER_PASSWORD_KEY));
    }

    public static String getUserPassword(String password) {
        try {
            return PwdUtil.encryptionPwd(password);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return password;
    }

    /**
     * 获取用户表集合
     *
     * @return
     */
    private static List<String> getUserTableNames() {
        EUserType[] values = EUserType.values();
        List<String> arrayList = new ArrayList<>(values.length);
        for (EUserType userType : values) {
            arrayList.add(userType.getTableName());
        }
        return arrayList;
    }

}